package qualomelhor.gwt.modules.client;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.TextArea;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Button;

public class Contato implements EntryPoint {
	RootPanel rootPanel;
	private Label lbId;
	private ListBox cbAssunto;
	private TextBox txtNome;
	private TextBox txtEmail;
	private TextArea txtMsg;
	private ISessionSuportServiceAsync serviceSupportSvc = GWT.create(ISessionSuportService.class);
	private LanguageConstants constants = GWT.create(LanguageConstants.class);

	public static native void showDivBloqueio()  /*-{
		//$wnd.alert("teste = " + $doc.getElementById("divBloqueio").style.display);
		$doc.getElementById("divBloqueio").style.display="block";
		$doc.getElementById("divBloqueioSolido").style.display="block";
	}-*/;

	public static native void hideDivBloqueio()  /*-{
		//$wnd.alert("teste = " + $doc.getElementById("divBloqueio").style.display);
		$doc.getElementById("divBloqueio").style.display="none";
		$doc.getElementById("divBloqueioSolido").style.display="none";
	}-*/;

	@Override
	public void onModuleLoad() {
		//Window.alert("Iniciando carregaFormContato..");
		rootPanel = RootPanel.get("divCadastroCentro");
		carregaFormContato("", "", 0, "");
	}

	private void carregaFormMensagem(String mensagem, final String nome, final String email, final int assuntoIndex, final String msg, final boolean finalizar) {
		rootPanel.clear();

		VerticalPanel verticalPanel = new VerticalPanel();
		rootPanel.add(verticalPanel);
		verticalPanel.setSize("100%", "100%");
		Label lbMsg = new Label(mensagem);
		verticalPanel.add(lbMsg);
		lbMsg.setStylePrimaryName(finalizar?"fontPadrao":"fontErro");

		String acao = finalizar?"Ok":constants.voltar();

		Button btnAcao = new Button(acao);
		verticalPanel.add(btnAcao);
		btnAcao.setStylePrimaryName("btnAcao");
		btnAcao.setHeight("30px");
		btnAcao.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				if (finalizar) {
					Window.Location.replace("/");
				} else {
					carregaFormContato(nome, email, assuntoIndex, msg);
				}
			}
		});
	}

	private void carregaFormContato(String nome, String email, int assuntoIndex, String msg) {
		System.out.println("carregaFormContato...1");
		rootPanel.clear();

		VerticalPanel verticalPanel = new VerticalPanel();
		rootPanel.add(verticalPanel);
		verticalPanel.setSize("500px", "300px");

		System.out.println("carregaFormContato...1");
		FlexTable tbContato = new FlexTable();
		verticalPanel.add(tbContato);

		Label lbAssunto = new Label(constants.assunto());
		tbContato.setWidget(0, 0, lbAssunto);

		cbAssunto = new ListBox();
		tbContato.setWidget(0, 1, cbAssunto);
		cbAssunto.addItem(constants.selecione_o_assunto() + "...");
		cbAssunto.addItem(constants.comentarios_ou_sugestoes());
		cbAssunto.addItem(constants.criticas_ou_reclamacoes());
		cbAssunto.addItem(constants.publicidade_ou_departamento_comercial());
		cbAssunto.addItem(constants.outro_assunto());
		cbAssunto.setSelectedIndex(assuntoIndex);
		cbAssunto.setStylePrimaryName("comboBoxContato");

		Label lbNome = new Label(constants.nome());
		tbContato.setWidget(1, 0, lbNome);

		txtNome = new TextBox();
		tbContato.setWidget(1, 1, txtNome);
		txtNome.setText(nome);
		txtNome.setStylePrimaryName("textBoxContato");

		Label lbEmail = new Label(constants.email_para_resposta());
		tbContato.setWidget(2, 0, lbEmail);

		txtEmail = new TextBox();
		tbContato.setWidget(2, 1, txtEmail);
		txtEmail.setText(email);
		txtEmail.setStylePrimaryName("textBoxContato");


		Label lbMsg = new Label(constants.mensagem());
		verticalPanel.add(lbMsg);

		txtMsg = new TextArea();
		verticalPanel.add(txtMsg);
		txtMsg.setText(msg);
		txtMsg.setStylePrimaryName("textArea");

		System.out.println("carregaFormContato...3");
		
		Button btnEnviar = new Button(constants.enviar());
		verticalPanel.add(btnEnviar);
		btnEnviar.setStylePrimaryName("btnAcao");
		//btnEnviar.setHeight("30px");
		//btnEnviar.getElement().getStyle().setFontSize(14, Unit.PX);
		//btnEnviar.setWidth("180px");
		btnEnviar.addStyleName("divCenter");
		verticalPanel.setCellHorizontalAlignment(btnEnviar, HasHorizontalAlignment.ALIGN_CENTER);


		btnEnviar.addClickHandler(new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				String msgErro = "";
				String validRegExp = "[a-zA-Z]+([_\\.-]?[a-zA-Z0-9]+)*@[a-zA-Z0-9]+([\\.-]?[a-zA-Z0-9]+)*(\\.[a-zA-Z]{2,4})+$";

				if (cbAssunto.getSelectedIndex() <= 0) {
					msgErro = constants.preencha_o_assunto();
				} else if (!txtEmail.getText().matches(validRegExp)) {
					msgErro = constants.preencha_um_email_valido_para_receber_a_resposta();
				} else if (txtMsg.getText().trim().equals("")) {
					msgErro = constants.preencha_a_mensagem_antes_de_enviar();
				}

				if (msgErro.equals("")) {
					enviaEmail(cbAssunto.getItemText(cbAssunto.getSelectedIndex()), txtNome.getText(), txtEmail.getText(), txtMsg.getText());
				} else {
					carregaFormMensagem(msgErro, txtNome.getText(), txtEmail.getText(), cbAssunto.getSelectedIndex(), txtMsg.getText(), false);
				}
			}
		});
		System.out.println("carregaFormContato...fim");
	}

	private void enviaEmail(String assunto, String nome, String email, String mensagem) {
		if (serviceSupportSvc == null) {
			serviceSupportSvc = GWT.create(ISessionSuportService.class);
		}

		GWT.setUncaughtExceptionHandler(new GWT.UncaughtExceptionHandler() {
			@Override
			public void onUncaughtException(Throwable e) {
				e.printStackTrace();
				System.out.println("Excecao nao tratada em Horario Carrega Sessao !!!!!!!!!!");
			}
		});

		AsyncCallback<Boolean> callback = new AsyncCallback<Boolean>() {
			@Override
			public void onFailure(Throwable caught) {
				Window.alert("Erro ao tentar carregar a sessao! Por favor, aperte a tecla F5 do seu teclado para atualizar!");
			}

			@Override
			public void onSuccess(Boolean b) {
				//Window.alert("Sessao sucess!");
				if (b) {
					carregaFormMensagem(constants.enviado_com_sucesso(), "", "", 0, "", true);
				} else {
					Window.alert("Erro ao tentar carregar a sessao! Por favor, aperte a tecla F5 do seu teclado para atualizar!");	
				}
			}
		};
		//Window.alert("carregando sessao...");
		serviceSupportSvc.enviaEmail(assunto, nome, email, mensagem, callback);
	}	
}